#include "head.h"
int main(int argc,char * argv[])
{
    //./server 192.168.187.128 1234 3
    ARGS_CHECK(argc,4);
    int workerNum = atoi(argv[3]);
    workerdata_t *workerArr = (workerdata_t *)malloc(sizeof(workerdata_t));
    memset(workerArr,0,sizeof(workerArr));
    //创建子进程，并获取每个子进程的状态
    makeWorker(workerNum,workerArr);
    int sockfd;
    //初始化tcp服务器
    tcpInit(argv[1],argv[2],&sockfd);//该函数会修改sockfd
    //初始化epoll
    int epfd = epoll_create(1);
    //操作监听集合：最开始监听sockfd，
    epollAdd(epfd,sockfd);
    // 监听每个子进程的pipesockfd，这样当子进程做完工作给主进程发送消息，主进程能够醒来
    for(int i=0;i<workerNum;i++)
    {
        epollAdd(epfd,workerArr[i].pipesockfd);
    }
    while(1)
    {
        struct epoll_event readySet[1024];
        int readyNum = epoll_wait(epfd,readySet,sizeof(readySet),-1);
        for(int i=0;i<readyNum;i++)
        {
            // 若是有新连接接入
            if(readySet[i].data.fd == sockfd)
            {
                int netfd = accept(sockfd,NULL,NULL);
                printf("1 client is connect!\n");
                //雇主有了netfd就需要将其发送给其他空闲的工人，压榨他们，使其工作
                //从所有子进程找到空闲的
                //顺序查找一个空闲的子进程
                for(int j=0;j<workerNum;j++)
                {
                    if(workerArr[j].status == FREE)
                    {
                        sendfd(workerArr[j].pipesockfd,netfd);
                        workerArr[j].status = BUSY;
                        break;
                    }
                }
                //若是有空闲的子进程，就把netfd发送给子进程
                //若是没有空闲的子进程，那么拒绝访问（因为主进程已经将netfd发送给了子进程，netfd的硬件链接数肯定大于1，因此关闭主进程的netfd没有影响:w）
                close(netfd);
            }else{
                // 某个子进程已经链接成功了，并且已经完成任务返回信息给主进程
                // 就需要找个这个子进程，将其状态从BUSY->FREE，避免进程只能使用一次
                int pipesockfd = readySet[i].data.fd;
                // 使用顺序查找，从fd找到是几号工人进程工作结束(只有工人工作结束向主线程返回tid)
                for(int j=0;j<workerNum;j++ )
                {
                    if(workerArr[j].pipesockfd == pipesockfd)
                    {
                        pid_t pid;
                        recv(pipesockfd,&pid,sizeof(pid),0);
                        printf("%d worker,pid = %d\n",j,pid);
                        workerArr[i].status = FREE;

                    }
                }
            }
        }
    }
    return 0;
}
